[C#] Convert string to double with 2 digit after decimal separator
        Posted  
        
            by st.stoqnov
        on Stack Overflow
        
        See other posts from Stack Overflow
        
            or by st.stoqnov
        
        
        
        Published on 2009-10-19T10:45:18Z
        Indexed on 
            2010/05/18
            3:20 UTC
        
        
        Read the original article
        Hit count: 1206
        
All began with these simple lines of code:
string s = "16.9";
double d = Convert.ToDouble(s);
d*=100;
The result should be 1690.0, but it's not. d is equal to 1689.9999999999998. All I want to do is to round a double to value with 2 digit after decimal separator. Here is my function.
private double RoundFloat(double Value)
{
    float sign = (Value < 0) ? -0.01f : 0.01f;
    if (Math.Abs(Value) < 0.00001) Value = 0;
    string SVal = Value.ToString();
    string DecimalSeparator = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator;
    int i = SVal.IndexOf(DecimalSeparator);
    if (i > 0)
    {
        int SRnd;
        try
        {
            // ????? ??????? ????? ???? ?????????? ??????????
            SRnd = Convert.ToInt32(SVal.Substring(i + 3, 1));
        }
        catch
        {
            SRnd = 0;
        }
        if (SVal.Length > i + 3)
            SVal = SVal.Substring(0, i + 3);
        //SVal += "00001";
        try
        {
            double result = (SRnd >= 5) ? Convert.ToDouble(SVal) + sign : Convert.ToDouble(SVal);
            //result = Math.Round(result, 2);
            return result; 
        }
        catch
        {
            return 0;
        }
    }
    else
    {
        return Value;
    }
But again the same problem, converting from string to double is not working as I want. A workaround to this problem is to concatenate "00001" to the string and then use the Math.Round function (commented in the example above).
This double value multiplied to 100 (as integer) is send to a device (cash register) and this values must be correct.
I am using VS2005 + .NET CF 2.0
Is there another more "elegant" solution, I am not happy with this one.
© Stack Overflow or respective owner